home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-06-28 | 1.8 KB | 122 lines | [TEXT/CWIE] |
- // Delayer.cp
-
- #ifndef Delayer_h
- #include "Delayer.h"
- #endif
-
- Delayer::Delayer( const Method& method )
- : postponer( method ),
- when( 0 ),
- delayLink( this )
- {
- Waiting();
- }
-
- Delayer::~Delayer()
- {
- }
-
- Heap<Delayer>& Delayer::Waiting()
- {
- static Heap<Delayer> waiting( &Delayer::Before );
- return waiting;
- }
-
- bool Delayer::Before( const Delayer& r ) const
- {
- Assert( Pending() );
- Assert( r.Pending() );
- return when <= r.when;
- }
-
- void Delayer::DelayBy( uint32 time )
- {
- // Comparing times doesn't work if
- // the times get too far into the future.
- Assert( time < maxuint32 / 4 );
-
- DelayTo( Tick::Now() + time );
- }
-
- void Delayer::DelayTo( Tick time )
- {
- Assert( !Pending() )
- when = time;
-
- if ( time <= Tick::Now() )
- postponer.Schedule();
- else
- Waiting().Add( delayLink );
- }
-
- void Delayer::Cancel()
- {
- Assert( Pending() );
- if ( postponer.Pending() )
- postponer.Cancel();
- else
- Waiting().Remove( delayLink );
- }
-
- void Delayer::Hasten()
- {
- if ( delayLink.Listed() )
- {
- Waiting().Remove( delayLink );
- postponer.Schedule();
- }
- }
-
- void Delayer::Flush()
- {
- if ( !Pending() )
- return;
-
- Hasten();
- postponer.Flush();
- }
-
- void Delayer::ScheduleTasks()
- {
- Tick now( Tick::Now() );
- Heap<Delayer>& waiting( Waiting() );
-
- while ( !waiting.IsEmpty() )
- {
- Delayer& task = *waiting.Top();
-
- if ( task.when > now )
- break;
-
- waiting.Remove( task.delayLink );
- task.postponer.Schedule();
- }
- }
-
- uint32 Delayer::SleepTime()
- {
- if ( !Postponer::CanSleep() )
- return 0;
-
- Heap<Delayer>& waiting( Waiting() );
-
- if ( waiting.IsEmpty() )
- return maxint32;
-
- Tick nextTime( waiting.Top()->when );
- Tick now( Tick::Now() );
-
- if ( nextTime <= now )
- return 0;
-
- return nextTime - now;
- }
-
- bool Delayer::Pending() const
- {
- return delayLink.Listed() || postponer.Pending();
- }
-
- #include "Heap.cp"
- #include "HeapLink.cp"
-